package com.ma.controller;

import com.ma.pojo.Node;

public class  nodeController {
    /**
     * 反转/逆序 单链表
     * @param node
     * @return
     */
    public static Node reverseOrder(Node node){
        Node pre=null;
        Node next=null;
        /*
        node:
                (1)
                |
               \/
             {data=1
             {next---->{data=2
                       {next---->{data=3
                                 {next---->null
            pre={data=null
                {next---->null
            next={data=null
                 {next---->null
            1.
                pre:null next:null node:123
                1)next=node.next:
                next:23
                2)node.next=pre:
                node:1.next=pre:null
                3)pre=node:
                pre=node:1.next:null
                4)node=next:
                node=next:23
            2.
                pre:1 next:23 node:23
                1)next=node.next:
                next:3
                2)node.next=pre:
                node:21
                3)pre=node:
                pre=node:2.next=1
                4)node=next:
                node=next:3
            3.
                pre:21 next:3 node:3
                1)next=node.next:
                next:null
                2)node.next=pre:
                node:321
                3)pre=node:
                pre=321
                4)node=next:
                node=null

             return pre:321

         */
        while (node!=null){
            next=node.next;
            node.next=pre;
            pre=node;
            node=next;
        }
        return pre;
    }

    /**
     * 删除单链表的某值
     * @param node
     * @param value
     * @return
     */
    public static Node removeValue(Node node,int value){
        /*
        跳过前面匹配的值，直接从不匹配的节点开始
         */
        while (node!=null){
            if(node.data!=value){
                break;
            }
            node=node.next;
        }
        Node pre=node;
        Node cur=node;
        /*
        遍历cur，如果当前节点不是value则pre=cur同步节点，反之如果是value则pre跳过当前节点，将pre指向cur下一个节点，cur继续向下走进行如此判断
         */
        while(cur!=null){
            if(cur.data==value){
                pre.next=cur.next;
            }else {
                pre=cur;
            }
            cur=cur.next;
        }

        return pre;

    }

}
